home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / reuse.lha / reuse / c / Errors.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  10KB  |  297 lines

  1. /* $Id: Errors.c,v 1.1 1992/08/13 12:29:12 grosch rel $ */
  2.  
  3. /* $Log: Errors.c,v $
  4.  * Revision 1.1  1992/08/13  12:29:12  grosch
  5.  * fix bugs with ANSI C
  6.  *
  7.  * Revision 1.0  1992/08/07  14:31:40  grosch
  8.  * Initial revision
  9.  *
  10.  */
  11.  
  12. /* Ich, Doktor Josef Grosch, Informatiker, Juli 1992 */
  13.  
  14. static char rcsid [] = "$Id: Errors.c,v 1.1 1992/08/13 12:29:12 grosch rel $";
  15.  
  16. # include "Errors.h"
  17.  
  18. # ifdef __cplusplus
  19. extern "C" {
  20. #  include "System.h"
  21. #  include "Memory.h"
  22. #  include "Sets.h"
  23. #  include "Idents.h"
  24. }
  25. # else
  26. #  include "System.h"
  27. #  include "Memory.h"
  28. #  include "Sets.h"
  29. #  include "Idents.h"
  30. # endif
  31.  
  32. # define MaxError    100
  33.  
  34. static void yyExit () { Exit (1); }
  35.  
  36. void (* Errors_Exit) () = yyExit;
  37.  
  38. typedef struct {
  39.    tPosition    Position;
  40.    bool        IsErrorCode;
  41.    short    ErrorNumber;
  42.    short    ErrorCode;
  43.    short    ErrorClass;
  44.    short    InfoClass;
  45.    union {
  46.       int    vInteger;
  47.       short    vShort;
  48.       long    vLong;
  49.       float    vReal;
  50.       bool    vBoolean;
  51.       char    vCharacter;
  52.       tStringRef vString;
  53.       tSet *    vSet;
  54.       tIdent    vIdent;
  55.    } Info;
  56. } tError;
  57.  
  58. static void WriteHead    ARGS((tPosition Position, int ErrorClass));
  59. static void WriteCode    ARGS((int ErrorCode));
  60. static void WriteInfo    ARGS((int InfoClass, char * Info));
  61. static void WriteMessage ARGS((bool IsErrorCode, int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info));
  62. static void StoreMessage ARGS((bool IsErrorCode, int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info));
  63. static int IsLess    ARGS((tError * i, tError * j));
  64.  
  65. static tError    ErrorTable [MaxError + 1];
  66. static int    MessageCount;
  67. static bool    IsStore        = false;
  68. static void (*    HandleMessage) ARGS((bool IsErrorCode, int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info)) = WriteMessage;
  69. static FILE *    Out            = stderr;
  70.  
  71. void ErrorMessage
  72. # if defined __STDC__ | defined __cplusplus
  73.    (int ErrorCode, int ErrorClass, tPosition Position)
  74. # else
  75.    (ErrorCode, ErrorClass, Position)
  76.    int ErrorCode, ErrorClass; tPosition Position;
  77. # endif
  78. {
  79.    (* HandleMessage) (true, ErrorCode, ErrorClass, Position, xxNone, NULL);
  80. }
  81.  
  82. void ErrorMessageI
  83. # if defined __STDC__ | defined __cplusplus
  84.    (int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info)
  85. # else
  86.    (ErrorCode, ErrorClass, Position, InfoClass, Info)
  87.    int ErrorCode, ErrorClass; tPosition Position; int InfoClass; char * Info;
  88. # endif
  89. {
  90.    (* HandleMessage) (true, ErrorCode, ErrorClass, Position, InfoClass, Info);
  91. }
  92.  
  93. void Message
  94. # if defined __STDC__ | defined __cplusplus
  95.    (char * ErrorText, int ErrorClass, tPosition Position)
  96. # else
  97.    (ErrorText, ErrorClass, Position)
  98.    char * ErrorText; int ErrorClass; tPosition Position;
  99. # endif
  100. {
  101.    (* HandleMessage) (false, MakeIdent (ErrorText, strlen (ErrorText)), ErrorClass, Position, xxNone, NULL);
  102. }
  103.  
  104. void MessageI
  105. # if defined __STDC__ | defined __cplusplus
  106.    (char * ErrorText, int ErrorClass, tPosition Position, int InfoClass, char * Info)
  107. # else
  108.    (ErrorText, ErrorClass, Position, InfoClass, Info)
  109.    char * ErrorText; int ErrorClass; tPosition Position; int InfoClass; char * Info;
  110. # endif
  111. {
  112.    (* HandleMessage) (false, MakeIdent (ErrorText, strlen (ErrorText)), ErrorClass, Position, InfoClass, Info);
  113. }
  114.  
  115. static void WriteHead
  116. # if defined __STDC__ | defined __cplusplus
  117.    (tPosition Position, int ErrorClass)
  118. # else
  119.    (Position, ErrorClass) tPosition Position; int ErrorClass;
  120. # endif
  121. {
  122.    WritePosition (Out, Position);
  123.    (void) fputs (": ", Out);
  124.    switch (ErrorClass) {
  125.    case xxFatal        : (void) fputs ("Fatal       ", Out); break;
  126.    case xxRestriction    : (void) fputs ("Restriction ", Out); break;
  127.    case xxError        : (void) fputs ("Error       ", Out); break;
  128.    case xxWarning    : (void) fputs ("Warning     ", Out); break;
  129.    case xxRepair    : (void) fputs ("Repair      ", Out); break;
  130.    case xxNote        : (void) fputs ("Note        ", Out); break;
  131.    case xxInformation    : (void) fputs ("Information ", Out); break;
  132.    default        : (void) fprintf (Out, "Error class: %d ", ErrorClass);
  133.    }
  134. }
  135.  
  136. static void WriteCode
  137. # if defined __STDC__ | defined __cplusplus
  138.    (int ErrorCode)
  139. # else
  140.    (ErrorCode) int ErrorCode;
  141. # endif
  142. {
  143.    switch (ErrorCode) {
  144.    case xxNoText    : break;
  145.    case xxSyntaxError    : (void) fputs ("syntax error"        , Out); break;
  146.    case xxExpectedTokens: (void) fputs ("expected tokens"    , Out); break;
  147.    case xxRestartPoint    : (void) fputs ("restart point"        , Out); break;
  148.    case xxTokenInserted    : (void) fputs ("token inserted "    , Out); break;
  149.    case xxTooManyErrors    : (void) fputs ("too many errors "    , Out); break;
  150.    default        : (void) fprintf (Out, " error code: %d", ErrorCode);
  151.    }
  152. }
  153.  
  154. static void WriteInfo
  155. # if defined __STDC__ | defined __cplusplus
  156.    (int InfoClass, char * Info)
  157. # else
  158.    (InfoClass, Info) int InfoClass; char * Info;
  159. # endif
  160. {
  161.    int i;
  162.    if (InfoClass == xxNone) return;
  163.    (void) fputs (": ", Out);
  164.    switch (InfoClass) {
  165.    case xxInteger    : (void) fprintf (Out, "%d", * (int *) Info); break;
  166.    case xxShort        : i =  * (short *) Info; (void) fprintf (Out, "%d", i); break;
  167.    case xxLong        : (void) fprintf (Out, "%ld", * (long *) Info); break;
  168.    case xxReal        : (void) fprintf (Out, "%e", * (float *) Info); break;
  169.    case xxBoolean    : (void) fprintf (Out, "%c", * (bool *) Info ? 'T' : 'F'); break;
  170.    case xxCharacter    : (void) fprintf (Out, "%c", * Info); break;
  171.    case xxString    : (void) fputs     (Info, Out); break;
  172.    case xxSet        : WriteSet     (Out, (tSet *) Info); break;
  173.    case xxIdent        : WriteIdent     (Out, * (tIdent *) Info); break;
  174.    default        : (void) fprintf (Out, "info class: %d", InfoClass);
  175.    }
  176. }
  177.  
  178. static void WriteMessage
  179. # if defined __STDC__ | defined __cplusplus
  180.    (bool IsErrorCode, int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info)
  181. # else
  182.    (IsErrorCode, ErrorCode, ErrorClass, Position, InfoClass, Info)
  183.    bool IsErrorCode; int ErrorCode, ErrorClass; tPosition Position; int InfoClass; char * Info;
  184. # endif
  185. {
  186.   WriteHead (Position, ErrorClass);
  187.   if (IsErrorCode) WriteCode (ErrorCode); else WriteIdent (Out, ErrorCode);
  188.   WriteInfo (InfoClass, Info);
  189.   (void) fputc ('\n', Out);
  190.   if (ErrorClass == xxFatal && ! IsStore) (* Errors_Exit) ();
  191. }
  192.  
  193. void WriteMessages
  194. # if defined __STDC__ | defined __cplusplus
  195.    (FILE * File)
  196. # else
  197.    (File) FILE * File;
  198. # endif
  199. {
  200.    int i;
  201.    char * Info;
  202.    char s [256];
  203.  
  204.    qsort ((char *) & ErrorTable [1], MessageCount, sizeof (tError), IsLess);
  205.    Out = File;
  206.    for (i = 1; i <= MessageCount; i ++) {
  207.       register tError * With = & ErrorTable [i];
  208.  
  209.       switch (With->InfoClass) {
  210.       case xxInteger    : Info = (char *) & With->Info.vInteger    ; break;
  211.       case xxShort    : Info = (char *) & With->Info.vShort    ; break;
  212.       case xxLong    : Info = (char *) & With->Info.vLong    ; break;
  213.       case xxReal    : Info = (char *) & With->Info.vReal    ; break;
  214.       case xxBoolean    : Info = (char *) & With->Info.vBoolean    ; break;
  215.       case xxCharacter    : Info = (char *) & With->Info.vCharacter; break;
  216.       case xxString    : StGetString (With->Info.vString, s); Info = s; break;
  217.       case xxSet    : Info = (char *) With->Info.vSet; break;
  218.       case xxIdent    : Info = (char *) & With->Info.vIdent    ; break;
  219.       }
  220.       WriteMessage (With->IsErrorCode, With->ErrorCode, With->ErrorClass, With->Position, With->InfoClass, Info);
  221.    }
  222.    Out = stderr;
  223. }
  224.  
  225. static void StoreMessage
  226. # if defined __STDC__ | defined __cplusplus
  227. (bool IsErrorCode, int ErrorCode, int ErrorClass, tPosition Position, int InfoClass, char * Info)
  228. # else
  229. (IsErrorCode, ErrorCode, ErrorClass, Position, InfoClass, Info)
  230. bool IsErrorCode; int ErrorCode, ErrorClass; tPosition Position; int InfoClass; char * Info;
  231. # endif
  232. {
  233.   if (MessageCount < MaxError) {
  234.     MessageCount ++;
  235.     {
  236.       register tError * With = & ErrorTable [MessageCount];
  237.  
  238.       With->Position    = Position;
  239.       With->IsErrorCode    = IsErrorCode;
  240.       With->ErrorNumber    = MessageCount;
  241.       With->ErrorCode    = ErrorCode;
  242.       With->ErrorClass    = ErrorClass;
  243.       With->InfoClass    = InfoClass;
  244.       switch (With->InfoClass) {
  245.       case xxInteger    : With->Info.vInteger    = * (int    *) Info; break;
  246.       case xxShort    : With->Info.vShort    = * (short    *) Info; break;
  247.       case xxLong    : With->Info.vLong    = * (long    *) Info; break;
  248.       case xxReal    : With->Info.vReal    = * (float    *) Info; break;
  249.       case xxBoolean    : With->Info.vBoolean    = * (bool    *) Info; break;
  250.       case xxCharacter    : With->Info.vCharacter    = * (char    *) Info; break;
  251.       case xxString    : With->Info.vString    = PutString (Info, strlen (Info)); break;
  252.       case xxSet    : With->Info.vSet = (tSet *) Alloc ((unsigned long) sizeof (tSet));
  253.                   MakeSet (With->Info.vSet, Size ((tSet *) Info));
  254.                   Assign (With->Info.vSet, (tSet *) Info); break;
  255.       case xxIdent    : With->Info.vIdent    = * (tIdent    *) Info; break;
  256.       }
  257.     }
  258.   } else {
  259.     {
  260.       register tError * With = & ErrorTable [MessageCount];
  261.  
  262.       With->IsErrorCode    = true;
  263.       With->ErrorCode    = xxTooManyErrors;
  264.       With->ErrorClass    = xxRestriction;
  265.       With->InfoClass    = xxNone;
  266.     }
  267.   }
  268.   if (ErrorClass == xxFatal) { WriteMessages (stderr); (* Errors_Exit) (); }
  269. }
  270.  
  271. static int IsLess
  272. # if defined __STDC__ | defined __cplusplus
  273.    (tError * i, tError * j)
  274. # else
  275.    (i, j) tError * i, * j;
  276. # endif
  277. {
  278.   register int r = Compare (i->Position, j->Position);
  279.   return r != 0 ? r : i->ErrorNumber - j->ErrorNumber;
  280. }
  281.  
  282. void StoreMessages
  283. # if defined __STDC__ | defined __cplusplus
  284.    (bool Store)
  285. # else
  286.    (Store) bool Store;
  287. # endif
  288. {
  289.   if (Store) {
  290.     HandleMessage = StoreMessage;
  291.     MessageCount  = 0;
  292.   } else {
  293.     HandleMessage = WriteMessage;
  294.   }
  295.   IsStore = Store;
  296. }
  297.